/*******************************************************************
 * 外语翻译平台(translate) 
 *
 * 成都一亿信息技术公司 版权所有
 * 
 * Copyright (C) 2010 Transer Information Technology Co., Ltd.
 *
 * @Version : 1.0  2011-2-26 下午01:37:41
 *
 * LanguageSetupAction.java 
 *
 *******************************************************************/
package com.transer.web.action.passport;

import java.util.ArrayList;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.transer.persistance.bean.ProfileLanguage;
import com.transer.persistance.bean.User;
import com.transer.persistance.dao.IUserDao;
import com.transer.persistance.exception.TranserDatabaseException;
import com.transer.utils.Utils;
import com.transer.web.action.TranserActionSupport;

/**
 * class defination are there
 * 
 * @author Mark
 * 
 * @version 1.0 ywengineer@gmail.com
 * 
 */
public class LanguageSetupAction extends TranserActionSupport {
	private static final long serialVersionUID = -4368351083797999451L;
	// 日志操作
	private static final Logger logger = Logger.getLogger(LanguageSetupAction.class);
	// 用户操作
	private IUserDao userDao;
	// 用户
	private User dump;
	// 擅长类型
	private String goodAt;
	// 返回消息
	private String message;
	// 方法
	private String method;
	// 用户备份数据
	private User copy;
	// 源语言
	private String langFrom;
	// 目标语言
	private String langTo;
	// 需要删除的语言对ID
	private String pairID;

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.opensymphony.xwork2.ActionSupport#execute()
	 */
	@Override
	public String execute() throws Exception {
		if ("save".equals(method)) {
			message = save();
		} else if ("addpair".equals(method)) {
			message = addLangPair();
		} else if ("deletepair".equals(method)) {
			message = deleteLangPair();
		}
		return message;
	}

	/**
	 * 保存语言设置
	 * 
	 * @return
	 * @throws Exception
	 */
	private String save() throws Exception {
		try {
			// 备份用户数据
			copy = (User) BeanUtils.cloneBean(user);
			// 擅长类型
			if (StringUtils.isNotEmpty(goodAt)) {
				goodAt = goodAt.replaceAll("\\s+", "");
				user.setGoodAt(goodAt);
			}
			// 擅长领域
			user.setGoodAtArea(dump.getGoodAtArea());
			// 母语
			user.setNativeLang(dump.getNativeLang());
			// 保存用户
			userDao.updateUser(user);
		} catch (Exception e) {
			logger.error("保存语言设置出错:" + e.getMessage());
			// 保存错误,还愿用户数据
			BeanUtils.copyProperties(user, copy);
			// 保存失败
			return TranserActionSupport.ERROR;
		}

		return TranserActionSupport.SUCCESS;
	}

	/**
	 * 添加语言对
	 * 
	 * @return
	 */
	private String addLangPair() {
		// 如果当前用户 的语言对超过4个.不再添加
		if (user.getLanguagePairs() != null && user.getLanguagePairs().size() >= 6) {
			return TranserActionSupport.ERROR;
		}
		// 源语言
		int lf = Utils.getInteger(langFrom);
		// 目标语言
		int lt = Utils.getInteger(langTo);
		// 如果源语言或者目标语言不存在,添加失败
		if (lf <= 0 || lt <= 0) {
			// 返回失败
			return TranserActionSupport.ERROR;
		}
		// 添加操作
		try {
			// 新建语言对
			ProfileLanguage pair = new ProfileLanguage();
			// 设置源语言
			pair.setLangFrom(lf);
			// 设置目标语言
			pair.setLangTo(lt);
			// 设置用户ID
			pair.setUserID(user.getId());
			// 设置语言对ID
			pair.setId(userDao.addLanguagePair(pair));
			// 如果用户不存在语言对
			if (user.getLanguagePairs() == null) {
				// 新建语言对列表
				user.setLanguagePairs(new ArrayList<ProfileLanguage>());
			}
			// 添加语言对
			user.getLanguagePairs().add(pair);
		} catch (TranserDatabaseException e) {
			// 添加失败
			logger.error("添加语言对失败" + e.getMessage());
			// 返回失败
			return TranserActionSupport.ERROR;
		}
		// 返回成功
		return TranserActionSupport.SUCCESS;
	}

	/**
	 * 删除语言方向
	 * 
	 * @return
	 */
	private String deleteLangPair() {
		// 如果需要删除的语言向ID不存在
		int did = Utils.getInteger(pairID);
		// 返回失败
		if (did <= 0) {
			return TranserActionSupport.ERROR;
		}
		// 删除
		try {
			userDao.deleteLanguagePair(user.getId(), did);
			// 从列表中删除
			deleteLanguagePair(did);
		} catch (TranserDatabaseException e) {
			// 删除失败
			logger.error("删除语言对失败" + e.getMessage());
			// 返回失败
			return TranserActionSupport.ERROR;
		}
		// 返回成功
		return TranserActionSupport.SUCCESS;
	}

	/**
	 * 删除语言对.
	 * 
	 * @param id
	 *            语言方向ID
	 */
	private void deleteLanguagePair(int id) {
		// 如果有语言对
		if (user.getLanguagePairs() != null) {
			// 目标方向
			ProfileLanguage find = null;
			// 遍历
			for (ProfileLanguage lang : user.getLanguagePairs()) {
				// 如果当前语言方向与目标一致
				if (lang.getId() == id) {
					// 找到
					find = lang;
					// 不再查找
					break;
				}
			}
			// 如果找到
			if (find != null) {
				// 删除
				user.getLanguagePairs().remove(find);
			}
		}
	}

	/**
	 * @return the userDao
	 */
	public IUserDao getUserDao() {
		return userDao;
	}

	/**
	 * @param userDao
	 *            the userDao to set
	 */
	public void setUserDao(IUserDao userDao) {
		this.userDao = userDao;
	}

	/**
	 * @return the dump
	 */
	public User getDump() {
		return dump;
	}

	/**
	 * @param dump
	 *            the dump to set
	 */
	public void setDump(User dump) {
		this.dump = dump;
	}

	/**
	 * @return the goodAt
	 */
	public String getGoodAt() {
		return goodAt;
	}

	/**
	 * @param goodAt
	 *            the goodAt to set
	 */
	public void setGoodAt(String goodAt) {
		this.goodAt = goodAt;
	}

	/**
	 * @return the message
	 */
	public String getMessage() {
		return message;
	}

	/**
	 * @param message
	 *            the message to set
	 */
	public void setMessage(String message) {
		this.message = message;
	}

	/**
	 * @return the method
	 */
	public String getMethod() {
		return method;
	}

	/**
	 * @param method
	 *            the method to set
	 */
	public void setMethod(String method) {
		this.method = method;
	}

	/**
	 * @return the langFrom
	 */
	public String getLangFrom() {
		return langFrom;
	}

	/**
	 * @param langFrom
	 *            the langFrom to set
	 */
	public void setLangFrom(String langFrom) {
		this.langFrom = langFrom;
	}

	/**
	 * @return the langTo
	 */
	public String getLangTo() {
		return langTo;
	}

	/**
	 * @param langTo
	 *            the langTo to set
	 */
	public void setLangTo(String langTo) {
		this.langTo = langTo;
	}

	/**
	 * @return the pairID
	 */
	public String getPairID() {
		return pairID;
	}

	/**
	 * @param pairID
	 *            the pairID to set
	 */
	public void setPairID(String pairID) {
		this.pairID = pairID;
	}
}
